// const hd = [1, 2, 3, 4];
// console.log(hd);
// console.table(hd);

// let cms = new Array(6); // [6] 当你只有1个元素的时候应该丢弃这种写法
// console.log(cms.length);
// console.table(cms);
// console.log(cms[2]);

// let arr = Array.of(6); // 当你只有1个元素的时候应该使用这种写法
// console.log(arr.length);
// console.table(arr);

// // 数组转换为字符串
// let hd1 = [1, 2, 3].join("-"); // 使用 - 分割
// let hd2 = String(hd); // 默认是  , 分割
// console.log(hd1, hd2);

// let str = "jasonCathaypacific.com";
// console.log(Array.from(str)); // 字符串转为数组
// let obj = {
//   0: "jason",
//   1: 32,
//   2: "男",
//   length: 3,
// };
// console.log(Array.from(obj, function () {})); // 对象转为数组，这种方法比较少，基本不使用, 这里可以传递第二个参数，对每个数组中的元素进行迭代操作

// let arr1 = ["hdcms", "houdunren"];
// let hd3 = ["js", "css"];
// arr1 = [...arr1, ...hd3];
// console.log(arr1);

// function sum(...args) {
//   // 函数形参使用展开语法... 是将你传入的参数转换为一个数组
//   return args.reduce((s, v) => {
//     return (s += v);
//   }, 0);
// }
// console.log(sum(1, 2, 3));

// console.log(..."htmljscss"); // ["h","t","m","l","j","s","c","s","s"]
// let [, year] = ["后盾人", 2023];
// console.log(year);

// // 数组的展开要看在哪儿 ...
// let [name, ...args] = ["后盾人", "houdunren.com", 2019]; // 在等号左边就是收['houdunren.com', 2019]
// console.log(args);
// let a = ["cms", ...args]; // 在等号右边就是开，['cms','houdunren.com', 2019]
// console.log(a);

// let [name1, year1 = 2010] = ["后盾人"]; // year1没有值，填写默认值
// console.log(year1);

// function rangeArray(begin, end) {
//   const array = [];
//   for (let i = begin; i <= end; i++) array.push(i);
//   return array;
// }

// console.log(rangeArray(13, 18));

// console.log(Array(5).fill("后盾人")); // 填充 "后盾人"
// console.log([1, 2, 3, 4, 5].fill("jason", 1, 3)); // 填充jason 从1的位置到3的位置都填充

// let arr2 = [1, 2, 3];
// arr2.push("hdrcms", "shop"); // 后面添加元素
// console.table(arr2);

// let arr3 = [1, 2, 3, 4, 5];
// arr3.splice(0, 2, "html", "css"); // 从0(数组下标)开始 删除2个 再填充两个html和css
// console.table(arr3);

// let hd4 = arr3.slice(1, 3); // 从1开始截取到3 返回一个截取后到数组 不改变原数组
// console.table("hd4", hd4);

// function move(array, from, to) {
//   if (from < 0 || to >= array.length) {
//     console.log("参数错误");
//     return;
//   }
//   const newArray = [...array];
//   let item = newArray.splice(from, 1);
//   return newArray.splice(to, 0, ...item);
// }
// let array = [1, 2, 3, 4];
// console.table(array, 1, 3);

// // 清空数组 直接让数组的长度为0 即可
// let hd5 = [1, 2, 3, 4, 5];
// let arr4 = hd5;
// hd5.length = 0;

// // 数组元素复制
// let hd6 = [1, 2, 3, 4, 5, 6];
// console.log(hd.copyWithin(3, 1, 3)); // 将数据复制到下标为3的位置，从下标为1开始，到下标为3结束，所以是2,3

// let arr5 = [1, 2, 3, 4, 2, 9];
// console.log(arr5.indexOf(9)); //从左开始查找，返回对应元素的下标, 第二参数是从哪里开始查找
// console.log(arr5.lastIndexOf(2)); // 从右开始查找
// console.log(arr5.includes(2)); // 返回真假，是否找到?

// function includes(array, find) {
//   for (const value of array) {
//     if (value === find) return true; // 找到就返回true
//   }
//   return false; // 否则返回false
// }
// console.log(includes(arr5, 3));

// let lessnos = [{ name: "js" }, { name: "css" }, { name: "mysql" }];
// let index = lessnos.findIndex(function (item) {
//   // 返回的是下标，索引 findIndex,  find返回的是数据
//   return item.name == "mysql";
// });
// console.log(index);

// // 原型属性上定义方法
// let arr6 = [1, 2, 3, 4, 5, 6, 7, 8];
// Array.prototype.findValue = function (cb) {
//   for (const value of this) {
//     if (cb(value)) return value;
//   }
//   return undefined;
// };

// const res = arr6.findValue(function (item) {
//   return item == 2;
// });

// // 排序
// let cart = [
//   { name: "iphone", price: 12000 },
//   { name: "imac", price: 18000 },
//   { name: "ipad", price: 3200 },
// ];

// cart = cart.sort(function (a, b) {
//   // [1,2], a = 1, b = 2
//   // 1-2 等于 负数 从小到大
//   // 2-1 等于 正数 从大到小
//   return a.price - b.price;
// });

// console.table(cart);

// // 自己手动实现排序
// let arr7 = [1, 5, 3, 9, 7];
// function sort(array, callback) {
//   for (const n in object) {
//     for (const m in object) {
//       if (callback(array[n], array[m]) < 0) {
//         const temp = array[n];
//         array[n] = array[m];
//         array[m] = temp;
//       }
//     }
//   }
//   return array;
// }

// arr7 = sort(arr7, function (a, b) {
//   return a - b;
// });

let data = [
  { name: "jason", age: 10 },
  { name: "jisoo", age: 30 },
];

// for of 要看你改的是否是引用类型
for (let val of data) {
  val.age += 10;
}
console.table(data);

let arr = [1, 2, 3]; // 值类型，并不是引用类型
for (let val of arr) {
  val++;
}
console.table(arr);

let lessons = [
  { title: "媒体查询响应式布局", category: "css" },
  { title: "FLex弹性盒模型", category: "css" },
  { title: "Mysql多表查询随意操作", category: "mysql" },
];

lessons.forEach((item, index, lessons) => {
  // console.log(index); 下标索引
  // console.log(lessons); 数组元素
  item.title = item.title.substring(0, 2);
});
console.table(lessons);

const user = [
  {
    name: "李四",
    js: 90,
  },
  {
    name: "张三",
    js: 99,
  },
];

let res = user.every(function (item) {
  return item.js >= 90;
});

// let res = user.some(function (item) { // 其中一个符合条件就返回真
//   return item.js >= 90;
// });

console.log(res ? "全部同学都是90分以上" : "有同学没有到达90分");

const cssLessons = lessons.filter(function (lessno) {
  return lessno.category == "css";
});
console.table(cssLessons);

let hd = [1, 2, 3, 4];
function filter(array, callback) {
  let newArray = [];
  for (const value of array) {
    if (callback(value) === true) newArray.push(value);
  }
  return newArray;
}

console.log(
  filter(hd, function (val) {
    return val > 2;
  })
);

// 时刻注意值和引用类型
let hd7 = lessons.map(function (val) {
  return {
    title: val.title,
    category: val.category,
    click: 100,
  };
});

console.table(hd7);

let arr8 = [1, 2, 3, 1, 1];
function arrayCount(array, item) {
  return array.reduce(function (total, cur) {
    // 初始值 total 为0
    // cur 当前值数组中的值
    return (total += item == cur ? 1 : 0);
  }, 0);
}

console.log(arrayCount(arr8, 1));

let arr9 = [1, 2, 3, 5, 2, 89];
function arrayMax(array) {
  return array.reduce(function (pre, cur) {
    return pre > cur ? pre : cur;
  });
}
console.log("arrayMax", arrayMax(arr9));

let cart = [
  { name: "iphonePromax", price: 12000 },
  {
    name: "ipad",
    price: 25000,
  },
  {
    name: "imac",
    price: 3600,
  },
  {
    name: "imac",
    price: 3600,
  },
];

function maxPrice(goods) {
  return goods.reduce(function (pre, cur) {
    return pre.price > cur.price ? pre : cur;
  });
}

function sum(goods) {
  return goods.reduce(function (total, cur) {
    return (total += cur.price);
  }, 0);
}

function getNameByPrice(goods, price) {
  return goods
    .reduce(function (arr, cur) {
      if (cur.price > price) arr.push(cur);
      return arr;
    }, [])
    .map(function (item) {
      return item.name;
    });
}

console.log("总共商品的价格:", sum(cart));
console.log("商品的最大价格", maxPrice(cart));
console.log("超过指定价格的商品", getNameByPrice(cart, 10000));

function filterGoods(goods) {
  return goods.reduce(function (arr, cur) {
    let find = arr.find(function (v) {
      return v.name == cur.name;
    });
    if (!find) arr.push(cur); // 循环找到name相同的商品
    return arr;
  }, []);
}
console.table(filterGoods(cart));
